Curso: 1. Primeros pasos | 2. Modelar con Java | 3. Pruebas automáticas | 4. Herencia | 5. Lógica de negocio básica | 6. Validación avanzada | 7. Refinar el comportamiento predefinido | 8. Comportamiento y lógica de negocio | 9. Referencias y colecciones | A. Arquitectura y filosofía | B. Java Persistence API | C. Anotaciones

Lección 6: Validación avanzada

Esta lección está disponible en PDF:


Nota para OpenXava 5.3 y superior

A partir de OpenXava 5.3 el nuevo Hibernate Validator incluido en OpenXava usa la API estándar de Bean Validation API en lugar de su propia API, por lo tanto el código de la sección 6.2 de esta lección no funciona tal cual con OpenXava 5.3. Usa el siguiente código en su lugar:

ISBNValidator.java
package org.openxava.facturacion.validators;
 
import javax.validation.*;
 
import org.apache.commons.logging.*;
import org.openxava.facturacion.annotations.*;
import org.openxava.util.*;
 
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.html.*;
 
public class ISBNValidator implements ConstraintValidator<ISBN, Object> {
 
    private static Log log = LogFactory.getLog(ISBNValidator.class);
    private static org.apache.commons.validator.routines.ISBNValidator
        validator = new org.apache.commons.validator.routines.ISBNValidator();
    private boolean search;
 
    public void initialize(ISBN isbn) {
        this.search = isbn.search();
    }
 
    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        if (Is.empty(value)) return true;
        if(!validator.isValid(value.toString())) return false;
        return search?isbnExists(value):true;
    }
 
    private boolean isbnExists(Object isbn) {
        try {
            WebClient client = new WebClient();
            HtmlPage page = (HtmlPage) client.getPage("http://www.bookfinder4u.com/" +
            "IsbnSearch.aspx?isbn=" + isbn + "&mode=direct");
 
            return page.asText().indexOf("ISBN: " + isbn) >= 0;
        } catch (Exception ex) {
            log.warn("Impossible to connect to bookfinder4u" +
            "to validate the ISBN. Validation fails", ex);
            return false;
        }
    }
}

ISBN.java:
package org.openxava.facturacion.annotations;
 
import java.lang.annotation.*;
 
import javax.validation.*;
 
import org.openxava.facturacion.validators.*;
 
@Constraint(validatedBy = ISBNValidator.class)
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ISBN {
 
    Class<?>[] groups() default{};
    Class<? extends Payload>[] payload() default{};
 
    boolean search() default true;
    String message() default "ISBN does not exist";
}

Necesitarás copiar las siguientes librerías de OpenXava/lib a Invoicing/web/WEB-INF/lib: cssparser.jar, htmlunit.jar, htmlunit-core-js.jar, httpclient.jar, httpcore.jar, httpmime.jar, nekothml.jar, sac.jar, xalan.jar, xercesImpl.jar. Además necesitarás descargar la siguiente librería y añadirla a la misma carpeta: xml-apis-2.10.0.jar

¿Problemas con la lección? Pregunta en el foro ¿Ha ido bien? Ve a la lección 7